package com.yisin.pbox.frame.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.lang.StringUtils;

import com.yisin.pbox.frame.log.ILogger;
import com.yisin.pbox.frame.log.LogFactory;

public class HttpUtil {
	private static ILogger logger = LogFactory.getDefaultLogger(HttpUtil.class);

	public static void main(String[] args) {
		String y = doGet("http://www.tuling123.com/openapi/api", 
				"key=0fa4896b678bd4840e83a86927bd7b64&info=明天北京飞拉萨的飞机", 
				"UTF-8", true);
		System.out.println(y);
	}

	/**
	 * 执行一个HTTP GET请求，返回请求响应的HTML
	 * 
	 * @param url
	 *            请求的URL地址
	 * @param queryString
	 *            请求的查询参数,可以为null
	 * @param charset
	 *            字符集
	 * @param pretty
	 *            是否美化
	 * @return 返回请求响应的HTML
	 */
	public static String doGet(String url, String queryString, String charset, boolean pretty) {
		StringBuffer response = new StringBuffer();
		HttpClient client = new HttpClient();
		HttpMethod method = new GetMethod(url);
		try {
			//logger.info("http get request url：" + url);
			//logger.info("http get request param：" + queryString);
			if (StringUtils.isNotBlank(queryString)){
				// 对get请求参数做了http请求默认编码，好像没有任何问题，汉字编码后，就成为%式样的字符串
				method.setQueryString(URIUtil.encodeQuery(queryString));
			}
			client.executeMethod(method);
			if (method.getStatusCode() == HttpStatus.SC_OK) {
				BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
				String line;
				while ((line = reader.readLine()) != null) {
					if (pretty)
						response.append(line).append(System.getProperty("line.separator"));
					else
						response.append(line);
				}
				reader.close();
			}
		} catch (URIException e) {
			logger.error("执行HTTP Get请求时，编码查询字符串“" + queryString + "”发生异常！", e);
		} catch (IOException e) {
			logger.error("执行HTTP Get请求" + url + "时，发生异常！", e);
		} finally {
			method.releaseConnection();
		}
		//logger.info("http get response：" + response.toString());
		return response.toString();
	}

	/**
	 * 执行一个HTTP POST请求，返回请求响应的HTML
	 * 
	 * @param url
	 *            请求的URL地址
	 * @param params
	 *            请求的查询参数,可以为null
	 * @param charset
	 *            字符集
	 * @param pretty
	 *            是否美化
	 * @return 返回请求响应的HTML
	 */
	public static String doPost(String url, Map<String, String> params, String charset, boolean pretty) {
		StringBuffer response = new StringBuffer();
		HttpClient client = new HttpClient();
		HttpMethod method = new PostMethod(url);
		// 设置Http Post数据
		logger.info("http post request url：" + url);
		if (params != null) {
			HttpMethodParams p = new HttpMethodParams();
			for (Map.Entry<String, String> entry : params.entrySet()) {
				p.setParameter(entry.getKey(), entry.getValue());
			}
			method.setParams(p);
			logger.info("http post request param：" + params.toString());
		}
		try {
			client.executeMethod(method);
			if (method.getStatusCode() == HttpStatus.SC_OK) {
				BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
				String line;
				while ((line = reader.readLine()) != null) {
					if (pretty)
						response.append(line).append(System.getProperty("line.separator"));
					else
						response.append(line);
				}
				reader.close();
			}
		} catch (IOException e) {
			logger.error("执行HTTP Post请求" + url + "时，发生异常！", e);
		} finally {
			method.releaseConnection();
		}
		logger.info("http post response：" + response.toString());
		return response.toString();
	}
	
	public static String getStreamParam(HttpServletRequest request){
		String param = null;
		try {
			InputStream ins = request.getInputStream();
			byte[] byt = new byte[1024];
			int i = ins.read(byt);
			StringBuffer sb = new StringBuffer();
			while(i != -1){
				sb.append(new String(byt, 0, i, "iso-8859-1"));
				i = ins.read(byt);
			}
			param = new String(sb.toString().getBytes("utf-8"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return param;
	}
	
	public static Map<String, String> keyValueToMap(String param){
		Map<String, String> map = new HashMap<String, String>();
		try {
			String[] pm = param.split("&"), kvs = null;
			for (int i = 0, k = pm.length; i < k; i++) {
				kvs = pm[i].split("=");
				map.put(kvs[0], kvs[1]);
			}
		} catch (Exception e) {
			map = new HashMap<String, String>();
		}
		return map;
	}

}
